6 #ifndef _CFEXPMULTIGRAPH_H_ 7 #define _CFEXPMULTIGRAPH_H_ 17 template<
typename TValue,
typename Enable =
void>
21 template<
typename TValue>
23 <TValue, typename std::enable_if_t<std::is_integral<TValue>::value>>
30 void AddEdge(TValue vert1, TValue vert2);
43 std::vector<vertex*> _ADJ;
44 vertex(TValue
id) : _ID(id), _CLR(false) { }
46 std::map<TValue, Ptr<vertex>> _graph_vertx_map;
48 void dfs_recurse(vertex * vert,
Ptr<std::map<
size_t, std::vector<TValue>>> res_map,
size_t g_number);
49 void dfs_not_rcs(vertex * vert,
Ptr<std::map<
size_t, std::vector<TValue>>> res_map,
size_t g_number);
50 bool try_clr_vtx(vertex * vert,
Ptr<std::map<
size_t, std::vector<TValue>>> res_map,
size_t g_number);
54 template<
typename TValue>
60 template<
typename TValue>
65 template<
typename TValue>
67 ::AddEdge(TValue vrtx1, TValue vrtx2)
72 if (!_graph_vertx_map.count(vrtx1))
75 _graph_vertx_map.insert(
MAP_PAIR(vertex1->_ID, vertex1));
78 vertex1 = _graph_vertx_map[vrtx1];
81 if (!_graph_vertx_map.count(vrtx2))
84 _graph_vertx_map.insert(
MAP_PAIR(vertex2->_ID, vertex2));
87 vertex2 = _graph_vertx_map[vrtx2];
89 vertex1->_ADJ.push_back(vertex2.get());
90 vertex2->_ADJ.push_back(vertex1.get());
95 template<
typename TValue>
103 if (_graph_vertx_map.empty())
108 size_t graph_number_generator = 0;
118 template<
typename TValue>
120 ::dfs_recurse(vertex * vert,
Ptr<std::map<
size_t, std::vector<TValue>>> res_map,
size_t g_number)
124 if (!try_clr_vtx(vert, res_map, g_number))
133 template<
typename TValue>
135 ::dfs_not_rcs(vertex * vert,
Ptr<std::map<
size_t, std::vector<TValue>>> res_map,
size_t g_number)
138 std::stack<vertex*> vertex_stack;
139 vertex_stack.push(vert);
140 while (!vertex_stack.empty())
142 auto current_vert = vertex_stack.top();
145 if (!try_clr_vtx(current_vert, res_map, g_number))
153 template<
typename TValue>
155 ::try_clr_vtx(vertex * vert,
Ptr<std::map<
size_t, std::vector<TValue>>> res_map,
size_t g_number)
163 if (!res_map->count(g_number))
164 res_map->insert(
MAP_PAIR(g_number, std::vector<TValue>()));
165 res_map->at(g_number).push_back(vert->_ID);
171 #endif // !_CFEXPMULTIGRAPH_H_ size_t GetEdgeCount() const
Definition: FEXPMultiGraph.h:34
#define IT
Definition: FEXPCommon.h:155
#define FEXPCOMMON_FOREACH_ITER_FNC(data, lambda_body)
Definition: FEXPCommon.h:157
Definition: FEXPCommon.h:276
static Ptr< TType > SafeAllocInstance(VarArgs &&... inpar)
It allocates data.
Definition: FEXPCommon.h:392
Definition: FEXPMultiGraph.h:18
#define MAP_PAIR(key, itm)
Definition: FEXPCommon.h:471
#define FEXPCOMMON_DEFAULT_VALUE
Definition: FEXPCommon.h:179
Smart pointer.
Definition: FEXPCommon.h:274